問題描述
如何避免使用 FirstOrDefault 未將對象引用設置為對象錯誤的實例? (How to avoid Object reference not set to instance of object error with FirstOrDefault?)
這是我的班級:
public class Employee
{
public int EmployeeId { get; set; }
public int Skillssetpoints { get; set; }
public string Name { get; set; }
public string EmployeeCode { get; set; }
public Nullable<System.DateTime> Date { get; set; }
}
代碼:
場景1:
var data=context.Employee.ToList(); //Get all employee records.
//Filter records by employee code(Emp01) and fetch single employee code.for eg:Emp01
var empCode = data.FirstOrDefault(t =>(t.EmployeeCode.Trim() == Model.EmployeeCode.Trim())).EmployeeCode;
在這裡,如果找不到與 Emp01
匹配的內容,則獲取錯誤對象引用未設置為對象實例但使用以下代碼修復此問題:
var Single = data.FirstOrDefault(t =>(t.EmployeeCode.Trim() == Model.EmployeeCode.Trim()));
if(single!=null)
{
var data=Single.EmployeeCode;
//Rest other code.
}
場景 2:
var data=context.Employee.ToList(); //Get all employee records.
//Fetch List of employee with Employee code:Emp01
var list= data.FirstOrDefault(t =>(t.EmployeeCode.Trim() == Model.EmployeeCode.Trim()));
在我的數據對像中,如果任何 EmployeeCode
為 null
那麼我收到此錯誤:
錯誤:對象引用未設置為對象實例
已修復:
var list= data.FirstOrDefault(t => (t.EmployeeCode != null) && (t.EmployeeCode.Trim() == Model.EmployeeCode.Trim()));
對於我的第二種情況,當我獲取員工的所有記錄並按員工代碼進行過濾時,我一開始沒有添加此空條件,因為我擁有所有員工記錄而沒有任何空員工代碼,並且一切正常,但在任何時候員工代碼變為 null 並得到了這個錯誤。所以將來我想避免這個錯誤。
所以我只想知道有沒有更好的方法來處理這兩種情況???
/p>/p>參考解法
方法 1:
For scenario 1, you can write something like this:
var employees = context.Employee.ToList();
var data = employees.Where(t => t.EmployeeCode.Trim() == Model.EmployeeCode.Trim())
.Select(t => t.EmployeeCode)
.FirstOrDefault();
if(data != null)
{
//Rest other code.
}
For scenario 2, you can add an extra where to filter out nulls. However way you slice it, you will need to check, but splitting up the filtering is nicer, at least in my opinion:
var list= data
.Where(d => d != null)
.FirstOrDefault(t => t.EmployeeCode.Trim() == Model.EmployeeCode.Trim());
方法 2:
var employees = context.Employee.ToList();
var result = employees.Where(t => (t.EmployeeCode ?? "").Trim() == (Model.EmployeeCode ?? "").Trim())
.Select(t => t.EmployeeCode).FirstOrDefault();
(by Learning‑Overthinker‑Confused、Rob、Palanikumar)